#!/bin/bash

# Docker 自动化部署脚本
# 使用方法: ./docker-deploy.sh [dev|prod] [--rebuild]

set -Eeuo pipefail

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 检查参数
ENVIRONMENT=${1:-dev}
REBUILD=${2:-""}

if [[ "$ENVIRONMENT" != "dev" && "$ENVIRONMENT" != "prod" ]]; then
    log_error "环境参数错误。使用方法: ./docker-deploy.sh [dev|prod] [--rebuild]"
    exit 1
fi

log_info "开始 Docker 部署到 $ENVIRONMENT 环境..."

# 检查 Docker
check_docker() {
    log_step "检查 Docker 环境..."
    
    if ! command -v docker &> /dev/null; then
        log_error "Docker 未安装"
        exit 1
    fi

    # 兼容 Compose v2 和 v1
    if docker compose version >/dev/null 2>&1; then
        COMPOSE="docker compose"
    elif command -v docker-compose >/dev/null 2>&1; then
        COMPOSE="docker-compose"
    else
        log_error "未检测到 Docker Compose（请安装插件或二进制）。"
        exit 1
    fi

    if ! docker info &> /dev/null; then
        log_error "Docker 服务未运行"
        exit 1
    fi

    log_info "Docker 环境检查完成（使用: $COMPOSE）"
}

# 准备环境文件
prepare_env() {
    log_step "准备环境配置..."
    
    if [ "$ENVIRONMENT" = "prod" ]; then
        if [ ! -f ".env.docker" ]; then
            log_error "生产环境配置文件 .env.docker 不存在"
            exit 1
        fi
        ENV_FILE=".env.docker"
        COMPOSE_FILE="docker-compose.prod.yml"
    else
        ENV_FILE=".env.example"
        COMPOSE_FILE="docker-compose.yml"
    fi
    
    log_info "使用配置文件: $ENV_FILE"
    log_info "使用 Compose 文件: $COMPOSE_FILE"
}

# 构建镜像
build_images() {
    log_step "构建 Docker 镜像..."
    
    if [ "$REBUILD" = "--rebuild" ]; then
        log_info "强制重新构建镜像..."
        $COMPOSE -f $COMPOSE_FILE --env-file $ENV_FILE build --no-cache
    else
        $COMPOSE -f $COMPOSE_FILE --env-file $ENV_FILE build
    fi
    
    log_info "镜像构建完成"
}

# 停止现有服务
stop_services() {
    log_step "停止现有服务..."
    
    $COMPOSE -f $COMPOSE_FILE --env-file $ENV_FILE down
    
    log_info "服务停止完成"
}

# 启动服务
start_services() {
    log_step "启动服务..."
    
    $COMPOSE -f $COMPOSE_FILE --env-file $ENV_FILE up -d
    
    log_info "服务启动完成"
}

# 健康检查
health_check() {
    log_step "进行健康检查..."
    
    sleep 10

    if ! command -v curl >/dev/null 2>&1; then
        log_warn "未安装 curl，跳过健康检查"
        return 0
    fi
    
    for i in {1..30}; do
        if curl -fsS http://localhost:3000/health > /dev/null 2>&1; then
            log_info "健康检查通过"
            return 0
        fi
        log_warn "健康检查失败，重试 $i/30..."
        sleep 5
    done
    
    log_error "健康检查失败"
    return 1
}

# 显示服务状态
show_status() {
    log_step "显示服务状态..."
    
    echo ""
    $COMPOSE -f $COMPOSE_FILE --env-file $ENV_FILE ps
    
    echo ""
    log_info "🎉 部署完成！"
    log_info "服务地址: http://localhost:3000"
    log_info "查看日志: $COMPOSE -f $COMPOSE_FILE logs -f"
    log_info "停止服务: $COMPOSE -f $COMPOSE_FILE down"
}

# 清理函数
cleanup() {
    log_error "部署失败，正在清理..."
    $COMPOSE -f $COMPOSE_FILE --env-file $ENV_FILE down
}

# 主部署流程
main() {
    trap cleanup ERR
    
    check_docker
    prepare_env
    stop_services
    build_images
    start_services
    
    if health_check; then
        show_status
    else
        log_error "部署失败"
        exit 1
    fi
}

# 执行主流程
main